home *** CD-ROM | disk | FTP | other *** search
/ Shareware Grab Bag / Shareware Grab Bag.iso / 010 / maze.arc / MAZE.PAS < prev    next >
Encoding:
Pascal/Delphi Source File  |  1986-12-31  |  16.4 KB  |  419 lines

  1. PROGRAM maze;
  2.   {       This program will generate a maze on the screen of an IBM
  3.       compatible PC.  A different random number seed will produce a
  4.       different maze.
  5.       
  6.           Written by James L. Dean
  7.                      406 40th Street
  8.                      New Orleans, LA 70124
  9.                      February 11, 1986
  10.   }  
  11.   {$I GRAPH.P}
  12.   CONST
  13.  
  14.     num_columns = 79;
  15.     num_rows = 49;
  16.     num_cells = 3871; { num_columns*num_rows }
  17.  
  18.     { color assignments follow: }
  19.  
  20.     wall = 3;      { wall must be positive }
  21.     passage = 0;   { wall, passage, new_path, and old_path must be different }
  22.     new_path = 1;
  23.     old_path = 2;
  24.     solution = 2;  { solution must be different from passage }
  25.  
  26.   VAR
  27.     delta_index_1              : INTEGER;
  28.     delta_index_2              : INTEGER;
  29.     delta_x                    : ARRAY [1..21,1..2] OF INTEGER;
  30.     delta_y                    : ARRAY [1..21,1..2] OF INTEGER;
  31.     finished                   : BOOLEAN;
  32.     magnitude_delta_x          : INTEGER;
  33.     magnitude_delta_y          : INTEGER;
  34.     old_path_found             : BOOLEAN;
  35.     passage_found              : BOOLEAN;
  36.     r_n                        : ARRAY [1..7] OF INTEGER;
  37.     r_n_index_1                : INTEGER;
  38.     r_n_index_2                : INTEGER;
  39.     random_number              : INTEGER;
  40.     response                   : CHAR;
  41.     seed                       : STRING[7];
  42.     stack                      : ARRAY[1..num_cells] OF INTEGER;
  43.     stack_index                : INTEGER;
  44.     tem_int_1                  : INTEGER;
  45.     tem_int_2                  : INTEGER;
  46.     x                          : INTEGER;
  47.     x_initial_1                : INTEGER;
  48.     x_initial_2                : INTEGER;
  49.     x_max                      : INTEGER;
  50.     x_next                     : INTEGER;
  51.     x_previous                 : INTEGER;
  52.     x_wall_1                   : INTEGER;
  53.     x_wall_2                   : INTEGER;
  54.     y                          : INTEGER;
  55.     y_initial_1                : INTEGER;
  56.     y_initial_2                : INTEGER;
  57.     y_max                      : INTEGER;
  58.     y_next                     : INTEGER;
  59.     y_previous                 : INTEGER;
  60.     y_wall_1                   : INTEGER;
  61.     y_wall_2                   : INTEGER;
  62.   BEGIN
  63.     ClrScr;
  64.     WRITE(OUTPUT,'Random number seed? ');
  65.     READLN(INPUT,seed);
  66.     magnitude_delta_x:=(319 DIV num_columns) DIV 2;
  67.     magnitude_delta_y:=(199 DIV num_rows) DIV 2;
  68.     x_max:=2*magnitude_delta_x*num_columns;
  69.     y_max:=2*magnitude_delta_y*num_rows;
  70.     WHILE (Length(seed) < 7) DO seed:=CONCAT('0',seed);
  71.     FOR r_n_index_1:=1 TO 7 DO
  72.       BEGIN
  73.         tem_int_1:=ORD(seed[r_n_index_1]);
  74.         WHILE (tem_int_1 > 23) DO tem_int_1:=tem_int_1-23;
  75.         IF tem_int_1 = 0 THEN tem_int_1:=1;
  76.         r_n[r_n_index_1]:=tem_int_1
  77.       END;
  78.     GraphColorMode;
  79.     Draw(0,0,0,y_max,wall);
  80.     Draw(0,y_max,x_max,y_max,wall);
  81.     Draw(x_max,y_max,x_max,0,wall);
  82.     Draw(x_max,0,0,0,wall);
  83.     FillShape(magnitude_delta_x,magnitude_delta_y,passage,wall);
  84.     x:=0;
  85.     WHILE (x <= x_max) DO
  86.       BEGIN
  87.         Draw(x,0,x,y_max,wall);
  88.         x:=x+magnitude_delta_x+magnitude_delta_x
  89.       END;
  90.     y:=0;
  91.     WHILE (y <= y_max) DO
  92.       BEGIN
  93.         Draw(0,y,x_max,y,wall);
  94.         y:=y+magnitude_delta_y+magnitude_delta_y
  95.       END;
  96.     FOR delta_index_1:=1 TO 10 DO
  97.       BEGIN
  98.         delta_x[delta_index_1,1]:=-magnitude_delta_x;
  99.         delta_y[delta_index_1,1]:=0
  100.       END;
  101.     FOR delta_index_1:=11 TO 17 DO
  102.       BEGIN
  103.         delta_x[delta_index_1,1]:=0;
  104.         delta_y[delta_index_1,1]:=magnitude_delta_y
  105.       END;
  106.     FOR delta_index_1:=18 TO 19 DO
  107.       BEGIN
  108.         delta_x[delta_index_1,1]:=magnitude_delta_x;
  109.         delta_y[delta_index_1,1]:=0
  110.       END;
  111.     FOR delta_index_1:=20 TO 21 DO
  112.       BEGIN
  113.         delta_x[delta_index_1,1]:=0;
  114.         delta_y[delta_index_1,1]:=-magnitude_delta_y
  115.       END;
  116.     FOR delta_index_1:=1 TO 21 DO
  117.       BEGIN
  118.         delta_x[delta_index_1,2]:=-delta_x[delta_index_1,1];
  119.         delta_y[delta_index_1,2]:=-delta_y[delta_index_1,1]
  120.       END;
  121.     x_initial_1:=x_max-magnitude_delta_x;
  122.     x_initial_2:=magnitude_delta_x;
  123.     WHILE (x_initial_1 >= x_initial_2) DO
  124.       BEGIN
  125.         y_initial_1:=magnitude_delta_y;
  126.         y_initial_2:=y_max-magnitude_delta_y;
  127.         delta_index_2:=1;
  128.         WHILE (y_initial_1 < y_max) DO
  129.           BEGIN
  130.             IF delta_index_2 = 1 THEN
  131.               BEGIN
  132.                 x:=x_initial_1;
  133.                 y:=y_initial_1
  134.               END
  135.             ELSE
  136.               BEGIN
  137.                x:=x_initial_2;
  138.                y:=y_initial_2
  139.               END;
  140.             IF GetDotColor(x,y) = passage THEN
  141.               BEGIN
  142.                 FillShape(x,y,new_path,wall);
  143.                 finished:=FALSE;
  144.                 WHILE (NOT finished) DO
  145.                   BEGIN
  146.                     FOR delta_index_1:=1 TO 21 DO
  147.                       BEGIN
  148.                         REPEAT
  149.                           random_number:=r_n[1];
  150.                           r_n_index_1:=1;
  151.                           FOR r_n_index_2:=2 TO 7 DO
  152.                             BEGIN
  153.                               tem_int_1:=r_n[r_n_index_2];
  154.                               r_n[r_n_index_1]:=tem_int_1;
  155.                               random_number:=random_number+tem_int_1;
  156.                               IF random_number > 23 THEN
  157.                                 random_number:=random_number-23;
  158.                               r_n_index_1:=r_n_index_2
  159.                             END;
  160.                           r_n[7]:=random_number
  161.                         UNTIL (random_number <= 21);
  162.                         tem_int_1:=delta_x[delta_index_1,delta_index_2];
  163.                         tem_int_2:=delta_x[random_number,delta_index_2];
  164.                         delta_x[delta_index_1,delta_index_2]:=tem_int_2;
  165.                         delta_x[random_number,delta_index_2]:=tem_int_1;
  166.                         tem_int_1:=delta_y[delta_index_1,delta_index_2];
  167.                         tem_int_2:=delta_y[random_number,delta_index_2];
  168.                         delta_y[delta_index_1,delta_index_2]:=tem_int_2;
  169.                         delta_y[random_number,delta_index_2]:=tem_int_1
  170.                       END;
  171.                     delta_index_1:=1;
  172.                     passage_found:=FALSE;
  173.                     WHILE ((delta_index_1 <= 21)
  174.                     AND    (NOT passage_found)) DO
  175.                       BEGIN
  176.                         x_next:=x+2*delta_x[delta_index_1,delta_index_2];
  177.                         y_next:=y+2*delta_y[delta_index_1,delta_index_2];
  178.                         IF x_next < 0 THEN
  179.                           delta_index_1:=delta_index_1+1
  180.                         ELSE
  181.                           IF x_next > x_max THEN
  182.                             delta_index_1:=delta_index_1+1
  183.                           ELSE
  184.                             IF y_next < 0 THEN
  185.                               delta_index_1:=delta_index_1+1
  186.                             ELSE
  187.                               IF y_next > y_max THEN
  188.                                 delta_index_1:=delta_index_1+1
  189.                               ELSE
  190.                                 IF GetDotColor(x_next,y_next) = passage THEN
  191.                                   passage_found:=TRUE
  192.                                 ELSE
  193.                                   delta_index_1:=delta_index_1+1
  194.                       END;
  195.                     IF passage_found THEN
  196.                       BEGIN
  197.                         FillShape(x_next,y_next,new_path,wall);
  198.                         IF delta_x[delta_index_1,delta_index_2] = 0 THEN
  199.                           BEGIN
  200.                             y_wall_1:=y+delta_y[delta_index_1,delta_index_2];
  201.                             x_wall_1:=x-magnitude_delta_x+1;
  202.                             x_wall_2:=x+magnitude_delta_x-1;
  203.                             Draw(x_wall_1,y_wall_1,x_wall_2,y_wall_1,new_path)
  204.                           END
  205.                         ELSE
  206.                           BEGIN
  207.                             y_wall_1:=y-magnitude_delta_y+1;
  208.                             y_wall_2:=y+magnitude_delta_y-1;
  209.                             x_wall_1:=x+delta_x[delta_index_1,delta_index_2];
  210.                             Draw(x_wall_1,y_wall_1,x_wall_1,y_wall_2,new_path)
  211.                           END;
  212.                         x:=x_next;
  213.                         y:=y_next
  214.                       END
  215.                     ELSE
  216.                       BEGIN
  217.                         delta_index_1:=1;
  218.                         old_path_found:=FALSE;
  219.                         WHILE ((delta_index_1 <= 21)
  220.                         AND    (NOT old_path_found)) DO
  221.                           BEGIN
  222.                             x_next:=x+2*delta_x[delta_index_1,delta_index_2];
  223.                             y_next:=y+2*delta_y[delta_index_1,delta_index_2];
  224.                             IF x_next < 0 THEN
  225.                               delta_index_1:=delta_index_1+1
  226.                             ELSE
  227.                               IF x_next > x_max THEN
  228.                                 delta_index_1:=delta_index_1+1
  229.                               ELSE
  230.                                 IF y_next < 0 THEN
  231.                                   delta_index_1:=delta_index_1+1
  232.                                 ELSE
  233.                                   IF y_next > y_max THEN
  234.                                     delta_index_1:=delta_index_1+1
  235.                                   ELSE
  236.                                     IF GetDotColor(x_next,y_next)
  237.                                      = old_path THEN
  238.                                       old_path_found:=TRUE
  239.                                     ELSE
  240.                                       delta_index_1:=delta_index_1+1
  241.                           END;
  242.                         FillShape(x,y,old_path,wall);
  243.                         IF old_path_found THEN
  244.                           BEGIN
  245.                             IF delta_x[delta_index_1,delta_index_2] = 0 THEN
  246.                               BEGIN
  247.                                 y_wall_1
  248.                                  :=y+delta_y[delta_index_1,delta_index_2];
  249.                                 x_wall_1:=x-magnitude_delta_x+1;
  250.                                 x_wall_2:=x+magnitude_delta_x-1;
  251.                                 Draw(
  252.                                  x_wall_1,y_wall_1,x_wall_2,y_wall_1,old_path)
  253.                               END
  254.                             ELSE
  255.                               BEGIN
  256.                                 y_wall_1:=y-magnitude_delta_y+1;
  257.                                 y_wall_2:=y+magnitude_delta_y-1;
  258.                                 x_wall_1
  259.                                  :=x+delta_x[delta_index_1,delta_index_2];
  260.                                 Draw(
  261.                                  x_wall_1,y_wall_1,x_wall_1,y_wall_2,old_path)
  262.                               END
  263.                           END;
  264.                         finished:=TRUE
  265.                       END
  266.                   END
  267.               END;
  268.            delta_index_2:=delta_index_2+1;
  269.            IF delta_index_2 > 2 THEN
  270.              BEGIN
  271.                delta_index_2:=1;
  272.                y_initial_1:=y_initial_1+magnitude_delta_y+magnitude_delta_y;
  273.                y_initial_2:=y_initial_2-magnitude_delta_y-magnitude_delta_y
  274.              END
  275.           END;
  276.         x_initial_1:=x_initial_1-magnitude_delta_x-magnitude_delta_x;
  277.         x_initial_2:=x_initial_2+magnitude_delta_x+magnitude_delta_x
  278.       END;
  279.     x:=magnitude_delta_x;
  280.     y:=num_rows*magnitude_delta_y;
  281.     tem_int_1:=num_rows DIV 2;
  282.     tem_int_1:=num_rows-2*tem_int_1;
  283.     IF tem_int_1 = 0 THEN y:=y-magnitude_delta_y;
  284.     y_wall_1:=y-magnitude_delta_y+1;
  285.     y_wall_2:=y+magnitude_delta_y-1;
  286.     FillShape(x,y,passage,wall);
  287.     WHILE (x < x_max) DO
  288.       BEGIN
  289.         x_next:=x+magnitude_delta_x+magnitude_delta_x;
  290.         IF x_next < x_max THEN
  291.          BEGIN
  292.            IF GetDotColor(x_next,y) <> passage THEN
  293.              BEGIN
  294.                FillShape(x_next,y,passage,wall);
  295.                x_wall_1:=x+magnitude_delta_x;
  296.                Draw(x_wall_1,y_wall_1,x_wall_1,y_wall_2,passage)
  297.              END
  298.          END;
  299.          x:=x_next
  300.       END;
  301.     x:=x_max-magnitude_delta_x;
  302.     WHILE (x > 0) DO
  303.       BEGIN
  304.         x_wall_1:=x-magnitude_delta_x+1;
  305.         x_wall_2:=x+magnitude_delta_x-1;
  306.         y:=magnitude_delta_y;
  307.         passage_found:=FALSE;
  308.         WHILE ((y < y_max) AND (NOT passage_found)) DO
  309.          IF GetDotColor(x,y) = passage THEN
  310.            passage_found:=TRUE
  311.          ELSE
  312.            y:=y+magnitude_delta_y+magnitude_delta_y;
  313.         y:=y-magnitude_delta_y-magnitude_delta_y;
  314.         WHILE (y > 0) DO
  315.           BEGIN
  316.             IF GetDotColor(x,y) <> passage THEN
  317.               BEGIN
  318.                 FillShape(x,y,passage,wall);
  319.                 y_wall_1:=y+magnitude_delta_y;
  320.                 Draw(x_wall_1,y_wall_1,x_wall_2,y_wall_1,passage)
  321.               END;
  322.             y:=y-magnitude_delta_y-magnitude_delta_y
  323.           END;
  324.         x:=x-magnitude_delta_x-magnitude_delta_x
  325.       END;
  326.     x:=magnitude_delta_x;
  327.     WHILE (x < x_max) DO
  328.       BEGIN
  329.         x_wall_1:=x-magnitude_delta_x+1;
  330.         x_wall_2:=x+magnitude_delta_x-1;
  331.         y:=magnitude_delta_y;
  332.         passage_found:=FALSE;
  333.         WHILE ((y < y_max) AND (NOT passage_found)) DO
  334.           IF GetDotColor(x,y) = passage THEN
  335.             passage_found:=TRUE
  336.           ELSE
  337.             y:=y+magnitude_delta_y+magnitude_delta_y;
  338.         y:=y+magnitude_delta_y+magnitude_delta_y;
  339.         WHILE (y < y_max) DO
  340.           BEGIN
  341.             IF GetDotColor(x,y) <> passage THEN
  342.               BEGIN
  343.                 FillShape(x,y,passage,wall);
  344.                 y_wall_1:=y-magnitude_delta_y;
  345.                 Draw(x_wall_1,y_wall_1,x_wall_2,y_wall_1,passage)
  346.               END;
  347.             y:=y+magnitude_delta_y+magnitude_delta_y
  348.           END;
  349.         x:=x+magnitude_delta_x+magnitude_delta_x
  350.       END;
  351.     Draw(1,0,2*magnitude_delta_x-1,0,passage);
  352.     Draw(x_max-2*magnitude_delta_x+1,y_max,x_max-1,y_max,passage);
  353.     Sound(440);
  354.     Delay(1000);
  355.     NoSound;
  356.     REPEAT UNTIL KeyPressed;
  357.     READ(KBD,response);
  358.     IF ((response = 'S') OR (response = 's')) THEN 
  359.       BEGIN
  360.         delta_x[1,1]:=magnitude_delta_x;
  361.         delta_y[1,1]:=0;
  362.         delta_x[2,1]:=0;
  363.         delta_y[2,1]:=magnitude_delta_y;
  364.         delta_x[3,1]:=-magnitude_delta_x;
  365.         delta_y[3,1]:=0;
  366.         delta_x[4,1]:=0;
  367.         delta_y[4,1]:=-magnitude_delta_y;
  368.         x:=magnitude_delta_x;
  369.         y:=magnitude_delta_y;
  370.         x_previous:=x;
  371.         y_previous:=-y;
  372.         Draw(x,0,x,y,solution);
  373.         stack_index:=0;
  374.         REPEAT
  375.           delta_index_1:=1;
  376.           passage_found:=FALSE;
  377.           REPEAT
  378.             WHILE ((delta_index_1 <= 4) AND (NOT passage_found)) DO
  379.               BEGIN
  380.                 x_next:=x+delta_x[delta_index_1,1];
  381.                 y_next:=y+delta_y[delta_index_1,1];
  382.                 IF GetDotColor(x_next,y_next) = passage THEN
  383.                   passage_found:=TRUE
  384.                 ELSE
  385.                   delta_index_1:=delta_index_1+1
  386.               END;
  387.             IF (NOT passage_found) THEN
  388.               BEGIN
  389.                 delta_index_1:=stack[stack_index];
  390.                 x_previous:=x-2*delta_x[delta_index_1,1];
  391.                 y_previous:=y-2*delta_y[delta_index_1,1];
  392.                 Draw(x,y,x_previous,y_previous,passage);
  393.                 x:=x_previous;
  394.                 y:=y_previous;
  395.                 stack_index:=stack_index-1;
  396.                 delta_index_1:=delta_index_1+1
  397.               END
  398.           UNTIL (passage_found);
  399.           x_next:=x_next+delta_x[delta_index_1,1];
  400.           y_next:=y_next+delta_y[delta_index_1,1];
  401.           IF y_next <= y_max THEN
  402.             BEGIN
  403.               stack_index:=stack_index+1;
  404.               stack[stack_index]:=delta_index_1;
  405.               Draw(x,y,x_next,y_next,solution);
  406.               x:=x_next;
  407.               y:=y_next
  408.             END
  409.         UNTIL (y_next > y_max);
  410.         Draw(x,y,x,y_max,solution);
  411.         Sound(440); 
  412.         Delay(1000);
  413.         NoSound;
  414.         REPEAT UNTIL KeyPressed;
  415.         READ(KBD,response)
  416.       END;
  417.     TextMode
  418.   END.
  419.